package com.xinzhi.service;

import com.xinzhi.dao.CartDao;
import com.xinzhi.dao.GoodsDao;

import com.xinzhi.dao.UserDao;
import com.xinzhi.entity.Cart;
import com.xinzhi.entity.Goods;
import com.xinzhi.entity.User;
import com.xinzhi.test.Show;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 业务处理
 */
public class ShowService {
    /**
     * 登录处理UserDao
     */
    public static void dl() {
        //调用输入方法
        Scanner in = new Scanner(System.in);
        //调用连接数据库的方法
        UserDao usd = new UserDao();
        //调用实用户实体类
        User us = new User();
        System.out.println("请输入您的用户名");
        //username用户名
        String username = in.next();
//        用户名传到实体类
        us.setUsername(username);
        System.out.println("请输入密码");
//        userpassword密码
        String userpasword = in.next();
//        调用方法看数据库里面是否有相同的用户信息
        int count = usd.login(username, userpasword);
        if (count != 1) {
            System.out.println("用户名或密码错误，请重新输入");
//            递归
            dl();
        } else {
            System.out.println("登录成功");
            //登录成功以后调用一级菜单
            Show.menu(username);
        }
    }

    /**
     * 注册处理UserDao
     */
    public static void zc() {
        //调用输入类
        Scanner in = new Scanner(System.in);
        //调用连接数据库的类
        UserDao usd = new UserDao();
        //调用实体类
        User us = new User();
        System.out.println("请输入用户名");
        //username用户名
        String username = in.next();
//        把用户名传到实体类
        us.setUsername(username);
        System.out.println("请输入密码");
//        直接把输入的密码传到实体类
        us.setPassword(in.next());
        System.out.println("请输入收货地址");
//        直接把地址传到实体类
        us.setAddress(in.next());
//        把用户名传到数据库看是否有重复的返回影响行数
        int count = usd.enroll_judge(username);
        //非等于1则就是没有这个用户，如过等于1则已经被占用了
        if (count != 1) {
//            调用添加方法把用户信息添加进去
            usd.enroll(us);
            System.out.println("注册成功");
//            注册成功后调用目录方法
            Show.menu(username);
        } else {
            System.out.println("用户名已存在，注册失败，请重新输入");
//            如果被注册了就从新让用户输入
            zc();
        }
    }

    /**
     * 购买商品并添加购物车GoodsDao和CartDao
     */
    public void getAll(String type, String username) {
        Scanner in = new Scanner(System.in);//输入方法
        Cart cart = new Cart();//实体类
        GoodsDao gd = new GoodsDao();//连接数据库类
        CartDao cd = new CartDao();//连接数据库实体类
        ArrayList<Goods> goods = gd.getAllusr(type);//调用商品表，把商品类型传进去
        System.out.println("请选择你要购买的商品");
//        循环输入同类型的数据表
        for (int i = 0; i < goods.size(); i++) {
            System.out.println((i + 1) + "." + goods.get(i).getName() + goods.get(i).getPrice() + "元    ");
        }
        //通过用户输入，找到集合下标
        int a = in.nextInt();
        if (a > goods.size() || a < 1) {
            System.out.println("您的输入有误.请重新输入");
            getAll(type, username);
        } else {
            //通过用户输入，获得用户需要购买的数量
            System.out.println("请输入要购买的数量");
            //传到实体类数量
            int number = in.nextInt();
            if (number > 9999 || number < 0) {
                System.out.println("你输入有误请从新输入");
                getAll(type, username);
            } else {
                cart.setNumber(number);
                //传到实体类商品名称
                cart.setName(goods.get(a - 1).getName());
                //传到实体类单价
                cart.setPrice(goods.get(a - 1).getPrice());
                //传到实体类用户名
                cart.getUser().setUsername(username);
                //整个数组传输过去
                int count = cd.selectGoods(cart);
                //判断用户选择的商品是否重复
                if (count != 1) {
                    cd.insertCart(cart);
                } else {
                    cd.updateCart(cart);
                }
//                输出产品成功加入购物车
                System.out.println(number + "个" + goods.get(a - 1).getName() + "成功加入购物车");
                //返回与退出
                getAl(type, username);
            }
        }
    }

    /**
     * 加入购物车后展示
     */
    public void getAl(String type, String username) {
        Scanner in = new Scanner(System.in);//调用输入
        System.out.println("购买完毕请输入 1.返回主菜单 2.返回上一级 0.结束购物并付款");
        String fh = in.next();
        Show show = new Show();//调用一级菜单
        switch (fh) {
            case "1":
                //调用一级菜单方法
                show.menu(username);
                break;
            case "2":
                //调用返回上一级方法
                getAll(type, username);
                break;
            case "0":
//                调用付款方法
                buy(username);
                break;
            default:
                System.out.println("没有你输入的，请从新输入");
                getAl(type, username);
        }
    }

    /**
     * 4.查看购物车CartDao
     *
     * @param user
     */
    public void lookcart(String user) {
        Scanner in = new Scanner(System.in);//调用输入类
        CartDao cd = new CartDao();//调用连接数据库类
        ArrayList<Cart> carts = cd.payment(user);//调用购物车整张表，看看此用户是否已经购买商品
        if (carts.size() == 0) {
            System.out.println("您还没有购买商品,请选择商品");
            Show.menu(user);//调用一级目录
        } else {
//            循环输出此用户要购买的商品
            for (int i = 0; i < carts.size(); i++) {
                    if(i >= 0 && i < carts.size()) {
                    // 将i重置为0，以确保它在有效范围内}
                }
                //商品名称，个数，单价
                System.out.println((i + 1) + "." + carts.get(i).getName() + carts.get(i).getNumber() + "个——————单价" + carts.get(i).getPrice() + "元");
            }
            System.out.println("1.移除商品 2.付款 3.返回主菜单");
            String cart = in.next();
            switch (cart) {
                case "1":
                    System.out.println("请选择你要删除的商品：通过序号进行删除");
                    int i = in.nextInt();

                    //传过去条件删除商品
                    cd.remove(carts.get(i - 1).getName(), user);
                    //给用户说他要移除的商品移除成功
                    System.out.println(carts.get(i - 1).getName() + carts.get(i).getNumber() + "个——————单价" + carts.get(i).getPrice() + "移除成功");
                    lookcart(user);//一次后再次查看购物车
                    break;
                case "2":
                    buy(user);//付款
                    break;
                case "3":
                    Show.menu(user);//返回菜单
                    break;
                default:
                    System.out.println("没有你输入人的请从新输入");
                    lookcart(user);
            }
        }
    }

    /**
     * 付款
     *
     * @param username
     */
    public void buy(String username) {
        UserDao userDao = new UserDao();
        CartDao cd = new CartDao();
        ArrayList<Cart> carts = cd.payment(username);//把用户传到数据库查看是否有此用户的商品返回值
        if (carts.size() == 0) {
            System.out.println("您还没有购买商品,请选择商品");
            Show.menu(username);//没有商品调用一级菜单
        } else {
            Scanner in = new Scanner(System.in);
            //总价
            int money = 0;
            //循环要购买的商品价格加起来
            for (int i = 0; i < carts.size(); i++) {
                //数据库里面的单价乘以个数
                money += carts.get(i).getNumber() * carts.get(i).getPrice();
            }
            System.out.println("已购买");
            //循环输出要购买的商品
            for (int i = 0; i < carts.size(); i++) {
                System.out.println((i + 1) + "." + carts.get(i).getName() + carts.get(i).getNumber() + "个——————单价" + carts.get(i).getPrice() + "元");
            }
            User u = userDao.InquireBalance(username);//调用数据库的余额
            System.out.println("用户余额为：" + u.getBalance());
            System.out.println("商品总价为：" + money);
            //判断余额是否足够
            if (money > u.getBalance()) {
                System.out.println("1.余额不足请充值 2.放弃购买");
                String b = in.next();
                switch (b) {
                    case "1":
                        recharge(username);//调用充值方法
                        buy(username);//调用付款方法，查看充值后余额是否充足
                        break;
                    case "2":
                        Show.menu(username);//放弃购买到一次菜单
                        break;
                    default:
                        System.out.println("你输入错误从新输入");
                        buy(username);
                }
            } else {
                //余额够了到付款
                fukuan(money, username);
            }
        }
    }

    /**
     * 结账
     *
     * @param money
     * @param username
     */
    public void fukuan(int money, String username) {
        System.out.println("1.确认购买 2.取消购买");
        UserDao userDao = new UserDao();
        User u = userDao.InquireBalance(username);
        Scanner in = new Scanner(System.in);
        String s = in.next();
        switch (s) {
            case "1":
                userDao.Inquire((u.getBalance() - money), username);//付款后扣除余额
                CartDao delete = new CartDao();//调用连接数据库类
                delete.delete(username);//删除改用户所买的商品
                System.out.println("付款成功你的余额为" + (u.getBalance() - money) + "感谢再次光临本店");
                break;
            case "2":
                Show.menu(username);//取消购买了到一级菜单
                break;
            default:
                System.out.println("你输入错误请从新输入人");
                fukuan(money, username);

        }
    }

    /**
     * 充值
     *
     * @param username
     */
    public void recharge(String username) {
        Scanner in = new Scanner(System.in);//输入类
        UserDao userDao = new UserDao();//连接数据库类
        User user = new User();//用户信息实体类
        User u = userDao.InquireBalance(username);//用于查询余额
        System.out.println("用户余额为" + u.getBalance() + "\n请输入充值额度:");
        int s = in.nextInt();
        //判断用户输入的数字大小，太大的从之不进去，太小的不能充值
        if (s > 99999 || s < 0) {
            System.out.println("你输入余额过大或者过小，请从新输入");
            recharge(username);//从新输入要冲的余额
        } else {
            double newbalance = s + u.getBalance();//把用户输入的数字和余额数字加起来
            user.setBalance(newbalance);//把充值最后的结果给传到实体类内
            userDao.InquireBalance(user, username);//把用户信息的实体类和用户名字传到数据库修改余额
            //再次查看余额
            userDao.InquireBalance(username);
            System.out.println("用户余额为" + newbalance);
        }
    }

    /**
     * 账户管理UserDao
     *
     * @param username
     */
    public void AccountManag(String username) {
        Scanner in = new Scanner(System.in);
        UserDao ud = new UserDao();//连接数据库实体类
        User user = new User();//用户信息实体类
        System.out.println("1:修改密码 2：修改地址");
        String revise = in.next();
        switch (revise) {
            //修改密码
            case "1":
                System.out.println("请输入新密码:");
                String userpassword = in.next();
                System.out.println("确认新密码:");
                String password = in.next();
                //判断第一次和第二此是否相同
                if (userpassword .equals(password) ) {
                    user.setPassword(password);
                    int num = ud.password(user, username);
                    System.out.println(num > 0 ? "修改成功请从新登录" : "修改失败");
                    //调用重新登录
                    Show.login();
                } else {
                    System.out.println("两次密码不一致修改失败，从新选择你要修改的信息");
                    AccountManag(username);
                }
                break;
            //修改地址
            case "2":
                System.out.println("请输入新地址");
                //修改的地址直接传到实体类
                user.setAddress(in.next());
                //用户输入的地址和用户名直接传到数据库内的用户信息
                int count1 = ud.address(user, username);
                System.out.println(count1 > 0 ? "修改成功" : "修改失败");
                Show.menu(username);//返回菜单
                break;
            default:
                System.out.println("你输入错误请从新输入");
                AccountManag(username);
        }
    }
}
